#ifndef _MB_MW_H_
#define _MB_MW_H_

#include "mb_type.h"
#include "mb_cmc_dev.h"
#include "mb_sto_dev.h"
#include "mb_prot.h"
#include "mb_store.h"
#include "mb_hci.h"

/* 中间件对设备操作 */
typedef struct MB_MW_DEV_STR
{
    cmc_op_status * cmc[CMC_SELECT_MAX_NBR];
    sto_op_status * sto[STO_SELECT_MAX_NBR];
} mw_dev_op;

typedef struct MW_PROT_SEL_STR
{
    PROT_SELECT prot_select;
    MB_STATUS   is_prot_set;
    CMC_SELECT  cmc_select;
    MB_STATUS   is_cmc_set;
} mw_prot_sel;

typedef struct MW_STO_SEL_STR
{
    STO_SELECT select;
    MB_STATUS  is_set;
} mw_sto_sel;

typedef struct MW_HCI_SEL_STR
{
    CMC_SELECT select;
    MB_STATUS  is_set;
} mw_hci_sel;

typedef struct MB_PROT_STR
{
    mw_dev_op     dev;
    mw_prot_sel   protsel;
    mw_sto_sel    stosel;
    mw_hci_sel    hcisel;
} mw_prvt, *mw_prvt_t;

/* MW 中 向mboot提供的数据协议操作函数接口 */
typedef struct MW_PROT_OP_STR
{
    MB_STATUS (*prot_select)(PROT_SELECT sel);    /* 选择数据解析协议  */
    MB_STATUS (*carrier_select)(CMC_SELECT sel);  /* 选择数据载体 (即选择数据传输的通道) */
    mb_buf_attr * (*transfer_and_parse)(void);    /* 帧解析出有效数据 */
    MB_XFR_STATUS (*get_xfr_status)(void);        /* 获得数据传输状态 */
} mw_prot_op, *mw_prot_op_t;

/* MW 中 向mboot提供的数据存储操作函数接口 */
typedef struct MW_STORE_OP_STR
{
    MB_STATUS (*carrier_select)(STO_SELECT sel, uint32_t size); /* 选择数据载体 (即选择数据存储的通道) */
    STO_SELECT (*get_carrier_select)(void);                     /* 获得选择的数据载体类型 */
    MB_XFR_STATUS (*store_firmware)(mb_buf_attr * buf_attr);    /* 保存 (存入) 固件 */
    mb_buf_attr * (*get_firmware)(void);                        /* 读出固件 */
    void (*store_firmware_size)(void);                          /* 保存固件大小 (字节) */
    uint32_t (*get_firmware_size)(void);                        /* 获得 固件大小 (字节) */
} mw_store_op, *mw_store_op_t;

/* MW 中 向mboot提供的人机交互操作函数接口 */
typedef struct MW_HCI_OP_STR
{
    int (*carrier_select)(CMC_SELECT sel);  /* 选择人机通信通道 */
    MB_STATUS (*wait_abort)(MB_STATUS SHOW_NOTICE);    /* 等待用户主动打断事件 */
    int (*menu_show)(void);          /* 菜单显示 */
    hci_req * (*select_parse)(void);   /* 处理用户输入选择 */
    MB_STATUS (*response)(MB_STATUS OP_RESULT);    /* 反馈用户操作结果 */
    MB_STATUS (*check_is_timeout)(uint32_t timeout); /* 检测行为在指定时间后是否超时 */
} mw_hci_op, *mw_hci_op_t;

/* 中间件操作 */
typedef struct MB_MW_STR
{
    mw_prot_op  * prot;
    mw_store_op * store;
    mw_hci_op *   hci;
    preboot_op *  preboot;
} mb_mw, *mb_mw_t;

/* 中间件初始化 */
mb_mw *mb_mw_init(void);

#endif
